import cv2
import numpy as np

# 读取图像
image = cv2.imread('input_data/src.jpg')

# 将图像转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 应用形态学操作（闭运算：填充小孔，开运算：去除小噪声）
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 定义形态学核
filtered_image = cv2.morphologyEx(gray_image, cv2.MORPH_OPEN, kernel)  # 开运算
filtered_image = cv2.morphologyEx(filtered_image, cv2.MORPH_CLOSE, kernel)  # 闭运算

# 定义多个灰度阈值
threshold_values = [16, 32, 48, 64, 80, 112, 128, 160, 192]

# 初始化一个空白的输出图像（用于存储灰度区域）
overlay = np.zeros_like(image, dtype=np.uint8)  # 注意：dtype=np.uint8

# 定义透明度
alpha = 0.5  # 半透明效果，0为完全透明，1为完全不透明

# 应用多个阈值，生成不同的灰度区域
for i, threshold in enumerate(threshold_values):
    # 二值化图像
    _, binary_image = cv2.threshold(filtered_image, threshold, 255, cv2.THRESH_BINARY)
    
    # 检测轮廓
    contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 打印当前阈值和轮廓信息
    print(f"阈值 {threshold} (索引 {i}): 检测到 {len(contours)} 个轮廓")
    
    # 筛选大面积区域（例如面积大于某个阈值）
    min_area = 100  # 设置最小面积阈值
    for contour in contours:
        area = cv2.contourArea(contour)
        print(area)
        if area > min_area:  # 仅保留大面积区域
            # 将当前区域的像素值设置为一个特定的灰度值
            color = (255 * (i + 1) // len(threshold_values),) * 3  # 生成灰度颜色（BGR格式）
            cv2.drawContours(overlay, [contour], -1, color, thickness=cv2.FILLED)

# 将灰度区域叠加到原图上
result = cv2.addWeighted(image, 1, overlay, alpha, 0)

# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Filtered Image', filtered_image)
cv2.imshow('Overlay Image', overlay)
cv2.imshow('Result Image', result)

# 等待按键按下后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()